Q3. 前の問題で作ったbから、次のように、入る数字の候補を5列目以降に書き込んだファイルcを作ってください
前の問題で作ったbから、次のように、入る数字の候補を5列目以降に書き込んだファイルcを作ってください
code:bash
$ head c
0 0 0 5
0 1 0 3
0 2 0 * 1 2 4
0 3 1 * 2 6
0 4 1 7
0 5 1 * 2 4 6 8
0 6 2 * 1 4 8 9
0 7 2 * 1 2 4 9
0 8 2 * 2 4 8
1 0 0 6
時間内に解けなかった
opy使うと簡単に解けそうだなぁ、とかは思っていた awk
はじめはmapを使って見つかったやつにフラグを立てて、見つからなかったやつだけ出力すればいけるのでは、みたいなことを考えていた
code:reverse.sh
awk '4<NF{ printf "%s %s %s %s", $1, $2, $3, $4; for (i=1;i<10;i++) {numsi=0} for (i=5; i<=NF; i++) { nums$i=1 } for (k in nums) { if (numsk != 1) printf " %s", k } printf "\n" } NF<=4{print}' b それでイケた
なんで勉強会の時は解けなかったんだ・・・
流石に見づらいので読みやすく
code:reverse.awk
4 < NF{
# 変わらない部分の出力
printf "%s %s %s %s", $1, $2, $3, $4
# フラグ0のマップの初期化
for (i=1;i<10;i++) {
}
# フィールド5以降の値をキーに、フラグを立てる
for (i=5; i<=NF; i++) {
}
# フラグの立っていないものだけ改行なしで出力
for (k in nums) {
printf " %s", k
}
# 最後に改行だけ出力
printf "\n"
}
NF <= 4{
# 4フィールド以下の行は計算をしない
print
}
これで、こう実行する
$ reverse.awk b
code:opy.sh
opy '5<len(F):{ x = F1:5; x.extend([x for x in range(1, 10) if not x in F5:]); print(" ".join(str(a) for a in x)) }; len(F)<=5:{print(F0)}' b リスト内包表記でイイカンジにできた
やはりawkのそれよりずっと書きやすい